#include "main.h"

int ListInitiate(SLNode **head)//初始化
{
    *head=(SLNode *)malloc(sizeof(SLNode));//申请头结点，由head指示其地址
    (*head)->next=NULL;//置结束标记NULL
}

int ListLength(SLNode *head)
{
    SLNode *p=head;//P指向头结点
    int size =0;//size初始为0

    while(p->next!=NULL)//循环计数
    {
        p=p->next;
        size++;
    }
    return size;
}

int ListInsert(SLNode *head,int i,DataType x)
//在带头结点的单链表head的第i(0<=i<=size)个结点前插入一个存放数据元素x的结点
//插入成功则返回1，失败则返回0
{
    SLNode *p,*q;
    int j;

    p=head;
    j=-1;
    while(p->next != NULL&&j<i-1)
        //最终让指针P指向第i-1个结点
    {
        p=p->next;
        j++;
    }

    if(j!=i-1)
    {
        printf("插入元素位置参数错！");
        return 0;
    }

    q=(SLNode *)malloc(sizeof(SLNode));//生成新结点
    q->data=x;//新结点数据域赋值

    q->next=p->next;
    p->next=q;
    return 1;
}

int ListDelete(SLNode *head,int i,DataType *x)
//删除带头结点单链表head的第i(0<=i<=size-1)个结点
//被删除结点的数据域值由x带回，删除成功则返回1，失败返回0
{
    SLNode *p,*s;
    int j;
    p=head;
    j=-1;
    while(p->next!=NULL&&p->next->next!=NULL&&j<i-1)
        //循环结束时指针P指向第i-1个结点
    {
        p=p->next;
        j++;
    }

    if(j!=i-1)
    {
        printf("删除数据元素位置参数错！");
        return 0;
    }

    s=p->next;//指针S指向ai结点
    *x=s->data;//把指针s所指结点的数据域值赋予x
    p->next=p->next->next;//删除
    free(s);//释放指针s所指结点的内存空间
    return 1;
}

int ListGet(SLNode *head,int i,DataType *x)
{
    SLNode *p;
    int j;

    p=head;
    j=-1;
    while(p->next!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }

    if(j!=i)
    {
        printf("取元素位置参数错！");
        return 0;
    }

    *x=p->data;
    return 1;
}

int Destroy(SLNode **head)
{
    SLNode *p,*p1;

    p=*head;
    while(p!=NULL)
    {
        p1=p;
        p=p->next;
        free(p1);
    }
    *head=NULL;
}

void main(void) {
    SLNode *head;
    int i , x;
    ListInitiate(&head);/*初始化*/
    for(i = 0; i < 10; i++) {
        if(ListInsert(head, i, i+1) == 0) /*插入10个数据元素*/
        {
            printf("错误! \n");
            return;
        }
    }

    if(ListDelete(head, 4, &x) == 0) { /*删除数据元素5*/
        printf("错误! \n");
        return;
    }
    printf("%d\n", ListLength(head));

    for(i = 0; i < ListLength(head); i++) {
        if(ListGet(head, i, &x) == 0) /*取元素*/
        {
            printf("错误! \n");
            return;
        }
        else printf("%d    ", x);/*显示数据元素*/
    }

    Destroy(&head);
}

